+2007-12-10 Richard Hult <richard@imendio.com>
+
+ * gdk/quartz/gdkprivate-quartz.h:
+ * gdk/quartz/gdkeventloop-quartz.c:
+ (_gdk_quartz_event_loop_get_pending),
+ (_gdk_quartz_event_loop_check_pending),
+ (_gdk_quartz_event_loop_release_event), (gdk_event_prepare),
+ (gdk_event_check), (gdk_event_dispatch):
+ * gdk/quartz/gdkevents-quartz.c: (gdk_events_pending)
+ (_gdk_events_queue): Fix a bug where we could end up trying to
+ handle the same event more than once. Based on patch from Paul
+ Davis.
+
2007-12-10 Tor Lillqvist <tml@novell.com>
* gtk-zip.sh.in: Include bin/gtk-builder-convert in the dev
static CFRunLoopSourceRef select_main_thread_source;
static CFRunLoopRef main_thread_run_loop;
+gboolean
+_gdk_quartz_event_loop_check_pending (void)
+{
+ return current_event != NULL;
+}
+
+NSEvent*
+_gdk_quartz_event_loop_get_pending (void)
+{
+ NSEvent *event;
+
+ event = current_event;
+ current_event = NULL;
+
+ return event;
+}
+
+void
+_gdk_quartz_event_loop_release_event (NSEvent *event)
+{
+ [event release];
+}
+
static gboolean
gdk_event_prepare (GSource *source,
gint *timeout)
{
NSEvent *event;
gboolean retval;
+
+ GDK_THREADS_ENTER ();
GDK_QUARTZ_ALLOC_POOL;
GDK_QUARTZ_RELEASE_POOL;
+ GDK_THREADS_LEAVE ();
+
return retval;
}
static gboolean
gdk_event_check (GSource *source)
{
+ gboolean retval;
+
+ GDK_THREADS_ENTER ();
+
if (_gdk_event_queue_find_first (_gdk_display) != NULL ||
- current_event)
- return TRUE;
+ _gdk_quartz_event_loop_check_pending ())
+ retval = TRUE;
+ else
+ retval = FALSE;
- /* FIXME: We should maybe try to fetch an event again here */
+ GDK_THREADS_LEAVE ();
- return FALSE;
+ return retval;
}
static gboolean
{
GdkEvent *event;
+ GDK_THREADS_ENTER ();
+
GDK_QUARTZ_ALLOC_POOL;
_gdk_events_queue (_gdk_display);
GDK_QUARTZ_RELEASE_POOL;
+ GDK_THREADS_LEAVE ();
+
return TRUE;
}
{
ufds[0].revents = G_IO_IN;
- /* FIXME: We can't assert here, but we might need to have a
- * queue for events instead.
- */
- /*g_assert (current_event == NULL);*/
-
current_event = [event retain];
n_active ++;
}
-NSEvent *
-_gdk_quartz_event_loop_get_current (void)
-{
- return current_event;
-}
-
-void
-_gdk_quartz_event_loop_release_current (void)
-{
- [current_event release];
- current_event = NULL;
-}
-
gdk_events_pending (void)
{
return (_gdk_event_queue_find_first (_gdk_display) ||
- (_gdk_quartz_event_loop_get_current () != NULL));
+ (_gdk_quartz_event_loop_check_pending ()));
}
GdkEvent*
void
_gdk_events_queue (GdkDisplay *display)
{
- NSEvent *current_event = _gdk_quartz_event_loop_get_current ();
+ NSEvent *event;
- if (current_event)
+ event = _gdk_quartz_event_loop_get_pending ();
+ if (event)
{
- if (!gdk_event_translate (current_event))
- [NSApp sendEvent:current_event];
-
- _gdk_quartz_event_loop_release_current ();
+ if (!gdk_event_translate (event))
+ [NSApp sendEvent:event];
+
+ _gdk_quartz_event_loop_release_event (event);
}
}
extern GdkWindow *_gdk_quartz_pointer_grab_window;
/* Event loop */
-NSEvent * _gdk_quartz_event_loop_get_current (void);
-void _gdk_quartz_event_loop_release_current (void);
+gboolean _gdk_quartz_event_loop_check_pending (void);
+NSEvent * _gdk_quartz_event_loop_get_pending (void);
+void _gdk_quartz_event_loop_release_event (NSEvent *event);
/* FIXME: image */
GdkImage *_gdk_quartz_image_copy_to_image (GdkDrawable *drawable,